package douyin

import (
	"GoServer/utils/config"
	"GoServer/utils/debug"
	"GoServer/utils/tool"
	"encoding/json"
	"errors"
	"fmt"
)

type StartTaskRequest struct {
	RoomId  string `json:"roomid"`
	AppId   string `json:"appid"`
	MsgType string `json:"msg_type"`
}

type StartTaskResponse struct {
	ErrNo  int      `json:"err_no"`
	ErrMsg string   `json:"err_msg"`
	LogId  string   `json:"logid"`
	Data   TaskData `json:"data"`
}

type TaskData struct {
	TaskId string `json:"task_id"` // 任务id, 每次启动任务都会返回一个任务id
}

func StartLiveTask(roomId string, msgType string, gameName string) ([]byte, error) {
	defer func() {
		if r := recover(); !tool.InterfaceIsNil(r) {
			debug.Logln(debug.Warn, "StartLiveTask err", r)
			// 请求置顶礼物失败， 返回给客户端
		}
	}()

	debug.Logln(debug.Info, "开启直播弹幕事件监听, ", msgType)
	data := &StartTaskRequest{
		RoomId:  roomId,
		AppId:   config.GetConfig("app").GetString(gameName + ".appid"),
		MsgType: msgType,
	}

	reqBody, err := json.Marshal(data)
	if err != nil {
		debug.Logln(debug.Warn, "Json to Byte error :", err)
		// 监听事件失败， 返回给客户端
		return nil, errors.New("StartLiveTask httpPost err:" + err.Error())
	}
	jsonStr := string(reqBody)
	debug.Logln(debug.Debug, "请求开通直播间互动任务：", jsonStr)

	headers := map[string]string{
		"content-type": "application/json;",
		"access-token": GetDYAccessToken(gameName),
	}

	res, err := tool.SendPostOnceRetry(config.GetConfig("app").GetString("douyin.startLiveData"), jsonStr, headers)
	if err != nil {
		// 监听事件失败， 返回给客户端
		return nil, errors.New("StartLiveTask1 httpPost err:" + err.Error())
	}
	msg := StartTaskResponse{}
	if err := json.Unmarshal(res, &msg); err != nil {
		debug.Logln(debug.Warn, err)
	}

	debug.Logln(debug.Info, "开启直播弹幕任务, 返回数据")
	debug.Logln(debug.Info, "ErrorCode:", msg.ErrNo)
	debug.Logln(debug.Info, "ErrorMsg:", msg.ErrMsg)
	debug.Logln(debug.Info, "logid:", msg.LogId)
	debug.Logln(debug.Info, "data, taskId:", msg.Data.TaskId)

	if msg.ErrNo != 0 {
		// 监听事件失败， 返回给客户端
		// 监听事件失败， 返回给客户端
		errMsg := ""
		switch msg.ErrNo {
		case 40023: // 40023	缺少必要的请求参数
			errMsg = "缺少必要的请求参数"
		case 40022: // 40022	无效的AccessToken
			errMsg = "无效的AccessToken"
		case 10001: // 10001	服务器内部错误
			errMsg = "服务器内部错误"
		case 5003019: // 5003019	推送任务不符合开启的限制条件
			errMsg = "推送任务不符合开启的限制条件"
		default:
			errMsg = "未知错误"
		}
		return nil, errors.New("StartLiveTask httpPost err:" + errMsg)
	} else {
		// 开启直播间任务成功
		debug.Logf(debug.Info, fmt.Sprintf("[roomid : %s][开启直播互动数据成功] : %+v", roomId, msg))

		return res, nil
	}
}
